//
//  QRCodeTool.h
//  二维码综合案例
//
//  Created by GR on 2017/10/23.
//  Copyright © 2017年 GR Harry. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

extern NSString * const QRCodeErrorDomain;

typedef enum : NSUInteger {
    QRCodeCorrectionLevel_H,  // 容错率30%
    QRCodeCorrectionLevel_Q,  // 容错率25%
    QRCodeCorrectionLevel_M,  // 容错率15%
    QRCodeCorrectionLevel_L   // 容错率7%
} QRCodeCorrectionLevel;

typedef enum : NSUInteger {
    QRCodeErrorCodeScanNoAuthorization,  // 未授权错误
    QRCodeErrorCodeSacnHardware,         // 硬件错误
} QRCodeErrorCode;


@class QRCodeTool;
@protocol QRCodeToolScanDelegate<NSObject>

- (void)qrCodeTool:(QRCodeTool *)qrCodeTool didScanResult:(NSArray <NSString *>*)codeContents;
- (void)qrCodeTool:(QRCodeTool *)qrCodeTool didEncountError:(NSError *)error;

@end


@interface QRCodeTool : NSObject

@end



@interface QRCodeTool(Generator)

/**
 生成一张二维码图片

 @param content 二维码内容
 @param imageScale 二维码图片生成后的放缩比，该值越大，图片越清晰
 @param correctionLevel 容错率
 @param centerImage 中间 logo 图片
 @param centerImageSize 中间 logo 图片的大小
 @return 二维码图片
 */
+ (UIImage *)generatorQRCodeWithContent:(NSString *)content imageScale:(CGFloat)imageScale correctionLevel:(QRCodeCorrectionLevel)correctionLevel centerImage:(UIImage *)centerImage centerImageSize:(CGSize)centerImageSize;


/**
 生成二维码图片，默认容错率为 M

 @param content 二维码内容
 @param centerImage 中间 logo 图片
 @param centerImageSize 中间 logo 图片的大小
 @return 二维码图片
 */
+ (UIImage *)generatorQRCodeWithContent:(NSString *)content centerImage:(UIImage *)centerImage centerImageSize:(CGSize)centerImageSize;

/**
 用字符串生成一张二维码图片，带 logo 图片，logo 图片的大小为二维码图片的0.3倍
 
 @param content 二维码内容
 @param centerImage logo 图片
 @return 二维码图片
 */
+ (UIImage *)generatorQRCodeWithContent:(NSString *)content centerImage:(UIImage *)centerImage;


/**
 用字符串生成一张二维码图片, 指定生成图片的清晰度

 @param content 二维码内容
 @param imageScale 二维码图片生成后的放缩比，该值越大，图片越清晰
 @return 二维码图片
 */
+ (UIImage *)generatorQRCodeWithContent:(NSString *)content imageScale:(CGFloat)imageScale;


/**
 用字符串生成一张二维码图片

 @param content 二维码内容
 @return 二维码图片
 */
+ (UIImage *)generatorQRCodeWithContent:(NSString *)content;

@end


@interface QRCodeTool(Detector)

/**
 从图片中识别出二维码中的信息，可以标记出被识别二维码的位置。

 @param image 待识别图片
 @param isDrawQRCodeFrame 是否将识别出的二维码在图片中框出来。
 @param completion codeContents: 是识别出的所有二维码的内容，resultImage: 是绘制框后的图片
 */
+ (void)detecteWithImage:(UIImage *)image
        isDrawQRCodeFrame:(BOOL)isDrawQRCodeFrame
               completion:(void (^)(NSArray <NSString *>* codeContents, UIImage *resultImage))completion;


/**
 从图片中识别出二维码

 @param image 待识别图片
 @return 图片中所有二维码的内容
 */
+ (NSArray <NSString *>*)detecteWithImage:(UIImage *)image;

@end


@interface QRCodeTool(Scan)

/**
 扫描二维码，可以绘制识别的二维码

 @param containerView 承载视图
 @param isDrawFrame 是否绘制识别的二维码
 @param delegate 代理对象
 */
- (void)scanQRCodeWithContainerView:(UIView *)containerView
                        isDrawFrame:(BOOL)isDrawFrame
                           delegate:(id<QRCodeToolScanDelegate>)delegate;

/**
 扫描二维码，不绘制识别的二维码
 
 @param containerView 承载视图
 @param delegate 代理对象
 */
- (void)scanQRCodeWithContainerView:(UIView *)containerView
                           delegate:(id<QRCodeToolScanDelegate>)delegate;

/**
 开始扫描
 */
- (void)startScanning;

/**
 停止扫描
 */
- (void)stopScanning;

/**
 设置敏感区域

 @param rect 外部传入的大小
 */
- (void)setRectOfInterest:(CGRect)rect;
@end
